package creative.fire.interview.ca;

/*为什么运行如下程序 , 方法sum2 不会导致栈溢出， 方法sum 会导致栈溢出？*/
public class OverStack1 {

	public static void main(String args[]) {
		System.out.println(sum2(9000));
		System.out.println(sum(9000));
	}

	static long sum(long a) {
		if (a == 1) {
			return 1;
		} else {
			return a + sum(a - 1);
		}
	}

	static long sum2(long a) {
		if (a == 1) {
			return 1;
		} else {
			return sum2(a - 1) + a; // 仅此顺序倒了一下
		}
	}
}
/*
 * 解答： 在javadoc中解释，StackOverflowError当发生栈溢出时抛出，栈溢出的原因是这个应用程序的递归层次太深。 
 * 在深入查阅，发现问题如下： 在 sum2(long)中每次递归，只需要执行到 return sum2(a - 1) + a;红字部分进入下一次递归。
 * 而在sum(long)中要执行到 return a + sum(a - 1) ;红字部分进入下一次递归。
 * 此时 在sum(long)中需要临时增加变量来保存a+sum(a-1)值的结果。
 * 而sum2(long)并不需要。所以在运算过程中sum(long) 比sum2(long)需要的临时变量多。 
 * 据此推断，不论是sum2(long) 还是  sum(long)当输入值足够大的时候都会溢出。
 * 足够小时都不会溢出。分别测试9000，7000结果与预测一致。
 */